https://blog.csdn.net/for_tech/article/details/77247665
https://blog.csdn.net/for_tech/article/details/77188121
https://blog.csdn.net/signmem/article/details/78565488
所有 Ceph 集群都需要至少一个监视器、且 OSD 数量不小于副本数。自举引导初始监视器是部署 Ceph 存储集群的第一步,监视器的部署也为整个集群奠定了重要框架,如存储池副本数、每个 OSD 拥有的归置组数量、心跳周期、是否需认证等,其中大多数选项都有默认值,但是建设生产集群时仍需要您熟知它们。
按照安装(快速)里的相同配置,我们能配置起监视器为 vm01(后面可以追加监视器vm02,vm03) , OSD 节点为 vm02 、 vm03 的集群。
监视器的自举引导
自举引导监视器(理论上是 Ceph 存储集群)需要以下几个条件:
惟一标识符: fsid 是集群的惟一标识,它是 Ceph 作为文件系统时的文件系统标识符。现在, Ceph 还支持原生接口、块设备、和对象存储网关接口,所以 fsid 有点名不符实了。
集群名称: 每个 Ceph 集群都有自己的名字,它是个不含空格的字符串。默认名字是 ceph 、但你可以更改;尤其是运营着多个集群时,需要用名字来区分要操作哪一个。
比如,当你以联盟架构运营多个集群时,集群名字(如 us-west 、 us-east )将作为标识符出现在 CLI 界面上。注意:要在命令行下指定某个集群,可以指定以集群名为前缀的配置文件(如 ceph.conf 、 us-west.conf 、 us-east.conf 等);也可以参考 CLI 用法( ceph --cluster {cluster-name} )。
监视器名字: 同一集群内的各监视器例程都有惟一的名字,通常都用主机名作为监视器名字(我们建议每台主机只运行一个监视器、并且不要与 OSD 主机复用。短主机名可以用 hostname -s 获取。
监视器图: 自举引导初始监视器需要生成监视器图,为此,需要有 fsid 、集群名(或用默认)、至少一个主机名及其 IP 。
监视器密钥环: 监视器之间通过密钥通讯,所以你必须把监视器密钥加入密钥环,并在自举引导时提供。
管理密钥环: 要使用 ceph 这个命令行工具,你必须有 client.admin 用户,所以你要创建此用户及其密钥,并把他们加入密钥环。
前述必要条件并未提及 Ceph 配置文件的创建,然而,实践中最好创建个配置文件,并写好 fsid 、 mon initial members 和 mon host 配置。
你也可以查看或设置运行时配置。 Ceph 配置文件可以只包含非默认配置, Ceph 配置文件的配置将覆盖默认值,把这些配置保存在配置文件里可简化维护。
具体过程如下:
前期准备
1 |
|
1 |
|
1 | cat > /etc/yum.repos.d/ceph.repo <<EOF |
1 |
|
1 |
|
selinux 安全相关:
日志文件上下文为 ceph_log_t,默认路径:/data/ceph/log
日志文件上下文为 ceph_var_lib_t,默认路径:/data/ceph/log
ceph 默认用户为ceph, 如果更改其它用户,那么/data/ceph/log /data/ceph/log 目录所有者必须改为ceph,/data/ceph/log权限默认为0750
1 |
|
1 |
|
1 |
|
修改配置文件
1) 创建/etc/ceph/{cluster name}.conf,最小模板:
[global]
fsid = {fsid}
mon initial members = {hostname}[,{hostname}]
mon host = {ip}[,{ip}]
完整示例版:
# yum 安装的ceph 默认集群名就是ceph。如果集群名为其它,比如cephfs, 那么集群配置文件名必须是cephfs.conf
1 |
|
# 客户端keyring配置
[client.admin]
keyring = /etc/ceph/ceph.client.admin.keyring
注意: 你也可以写 IPv6 地址,但是必须设置 ms bind ipv6 = true
添加第一个mon
1 |
|
# 以下是解释说明:
2)创建 mon keyring:
ceph-authtool --create-keyring /etc/ceph/{cluster name}.mon.keyring --gen-key -n mon. --cap mon 'allow *'
3)创建administrator keyring:
ceph-authtool --create-keyring /etc/ceph/{cluster name}.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow'
4) 把client.admin的key加入mon.keyring:
ceph-authtool /etc/ceph/{cluster name}.keyring --import-keyring /etc/ceph/{cluster name}.client.admin.keyring
5) 创建monmap:使用hostname、IP、FSID生成一个monitor map
monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /etc/ceph/monmap
6) 创建mon的数据路径:在monitor主机上创建默认的数据目录
mkdir /data/ceph/mon/{cluster-name}-{hostname}
7) 初始化mon,提供monmap和keyring给monitor deamon:
ceph-mon [ --cluster {cluster-name} ] --mkfs -i {hostname} --monmap /etc/ceph/monmap --keyring /etc/ceph/{cluster name}.mon.keyring
8) 配标记monitor配置好了,可以启动
touch /data/ceph/mon/{cluster-name}-{hostname}/done
9) 修改权限
chown -R ceph.admin:ceph.admin /data/ceph/mon
10) 启动monitor
systemctl start ceph-mon@vm01
如果启动出错,尝试运行下面命令,再重启程序
systemctl reset-failed ceph-mon@vm01.service
11) 查看集群状态,ceph -s,因为此时还没有OSD,所以集群是HEALTH_ERR状态,pg都是creating状态
添加其他monitor节点
## 从第一个mon节点复制文件到新mon节点
sudo chown -R ceph.admin /etc/ceph
scp /etc/ceph/{ceph*,monmap} ceph.admin@web01:/etc/ceph/
需要从第一个节点拷贝4个文件,keyring的文件权限0600:
/etc/ceph/{cluster-name}.keyring
/etc/ceph/monmap
/etc/ceph/{cluster-name}.client.admin.keyring
/etc/ceph/{cluster-name}.conf
接下来只需要几步,具体命令参考第一个节点:
创建mon的数据路径,后面一条命令会自动创建,此命令可以不用执行
mkdir /data/ceph/mon/ceph-mon.vm02
提供monmap和keyring给monitor deamon
1 |
|
手动部署osd
## 需要确保 osd 数据盘有读写权限
chown -R ceph.admin:disk /dev/sdc{2,3,4}
1 |
|
1)产生用于osd 的 uuid, 每个osd都需要一个唯一的uuid
uuidgen
270cac2a-359d-4ebd-9713-612f81fb4bb2
2) 调用 ceph osd create 分配OSD编号:ceph osd create {uuid} {osd数字编号}
## ceph osd create [{uuid} [{id}]]
ceph osd create 270cac2a-359d-4ebd-9713-612f81fb4bb2 1 --cluster ceph
3) 调用 ceph-osd -i {osd数字编号} --mkfs --mkkey --osd-uuid {uuid} 初始化OSD目录:
# 必须先创建对应的目录ceph-osd.1 为{集群名}-{osd.数字编号},这里osd 的id只能用数字不能用字符
mkdir /data/ceph/osd/ceph-1
mkdir /data/ceph/osd/ceph-1/journal
ceph-osd -i 1 --mkfs --mkjournal --mkkey --osd-uuid 270cac2a-359d-4ebd-9713-612f81fb4bb2
# 上面的命令会初始化目录,并产生一个授权文件/data/ceph/osd/ceph-osd.1/keyring
4) 添加osd授权
ceph auth add osd.1 osd 'allow *' mon 'allow profile osd' -i /data/ceph/osd/ceph-1/keyring
到这里,OSD的准备工作就已经做好了,可以启动OSD了,在启动之前,也可以先初始化一下crush map。
osd.1 这是虚拟节点,1是{osd数字编号}
5) 添加一个host节点vm01
#添加一个host节点vm01
ceph osd crush add-bucket vm01 host
# 将vm01移到default下
ceph osd crush move vm01 root=default
# 将osd.1以1.0的权重加到vm01中
ceph osd crush add osd.1 1.0 host=vm01
# 查看当前OSD Tree
ceph osd tree
osd.1添加到vm01,osd.2添加到vm02,osd.3添加到vm03。这么做目的是因为Ceph默认分配的策略是至少有一份数据在其他机器上.
6)修改权限
#用systemctl启动必须添加空文件sysvinit,否则只能手工启动
touch /data/ceph/osd/ceph-1/{done,upstart}
##touch /data/ceph/osd/ceph-1/sysvinit
chown -R ceph.admin:ceph.admin /data/ceph/osd
7) 启动osd
# 启动osd
ceph-osd -i 1
#或者如下方式启动
systemctl start ceph-osd@1
或手工启动
/usr/bin/ceph-osd -i 1 --pid-file /var/run/ceph/osd.1.pid -c /etc/ceph/ceph.conf --cluster ceph --osd-data=/data/ceph/osd/ceph-1 --osd-journal=/data/ceph/osd/ceph-1/journal
# 查看当前OSD Tree
ceph osd tree
# 查看集群状态
ceph -s
## 用systemctl 启动不了osd, 需要修改ceph-osd-prestart.sh,此文件在启动文件里有运行
## 查看
# vi /usr/lib/systemd/system/ceph-osd@.service
ExecStartPre=/usr/lib/ceph/ceph-osd-prestart.sh --cluster ${CLUSTER} --id %i
## 修改,自定义的目录路径和运行用户名
vi /usr/lib/ceph/ceph-osd-prestart.sh
......
#data="/var/lib/ceph/osd/${cluster:-ceph}-$id"
data="/data/ceph/osd/${cluster:-ceph}-$id"
......
if [ $owner != 'ceph.admin' -a $owner != 'ceph' -a $owner != 'root' ]; then
6) 分别在vm02 vm03, 执行上述命令,{osd数字编号}要修改
OSD使用ceph-disk初始化
初始化完mon之后,添加OSD只需要几个简单的命令。
使用ceph-disk 初始化硬盘或分区或文件夹:
ceph-disk prepare --cluster {cluster-name} --cluster-uuid {uuid} --fs-type {ext4|xfs|btrfs} {data-path} [{journal-path}]
如:
sudo ceph-disk prepare --cluster ceph --cluster-uuid a7f64266-0894-4f1e-a635-d0aeaca0e993 --fs-type ext4 /dev/sdb
需要注意的是,这里所说的journal-path,实践中发现其实应该填写的是一个block device或者一个文件名,而不是一个文件夹。如果data-path是文件夹,fs-type选项可以忽略。
激活OSD:
ceph-disk activate {data-path} [--activate-key {path}]
其中的参数activate-key是可选的,用来指定/data/ceph/bootstrap-osd/{cluster}.keyring的位置。这个keyring是在ceph-mon mkfs时生成的,所以需要从刚才初始化的mon节点里拷贝过来。
OSD 使用bluestore
## 下面的 osd_data_1/bluestore_block_db_1等,表示 osd 1 的分区,确保label系统中唯一
## 要想使用识别某类盘,需要使用 --typecode= 参数
## 清除所有的分区信息
# sgdisk --zap-all /dev/sdb
## 创建osd data 分区,用于存放keyring等信息文件
# sgdisk --new=1:0:+1GB --change-name=1:osd_data_1 --partition-guid=1:$(uuidgen) --mbrtogpt -- /dev/sdb
## 创建block db wal
# sgdisk --new=2:0:+1GB --change-name=2:bluestore_block_db_1 --partition-guid=2:$(uuidgen) --mbrtogpt -- /dev/sdb
# sgdisk --new=3:0:+1GB --change-name=3:bluestore_block_wal_1 --partition-guid=3:$(uuidgen) --mbrtogpt -- /dev/sdb
# sgdisk --new=4:0:+15GB --change-name=4:bluestore_block_1 --partition-guid=4:$(uuidgen) --mbrtogpt -- /dev/sdb
## 记得更改磁盘的权限,系统重启会导致权限恢复到默认值,导致无法启动osd
chown -R root:ceph.admin /dev/sdb{1,2,3,4}
或者
chown -R ceph.admin:disk /dev/sdb{1,2,3,4}
为防止系统重启权限恢复默认值:
添加udev规则设置分区权限
# vi /etc/udev/rules.d/20-ceph-osd.rules
KERNEL=="sdb*", SUBSYSTEM=="block", ENV{DEVTYPE}=="partition", OWNER="ceph.admin", GROUP="ceph.admin", MODE="0660"
或者,下面这一条重启不能生效, 必须手动触发udev命令,其中bluestore就是gpt自定义的label
KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="partition",PROGRAM=="/usr/bin/udevadm info $devnode | grep ID_PART_ENTRY_NAME", RESULT=="*bluestore*", OWNER="ceph.admin", GROUP="ceph.admin", MODE="0660"
# partx /dev/sdb
NR START END SECTORS SIZE NAME UUID
1 2048 2099199 2097152 1G osd_data_1 2f568a34-d89c-4c74-a444-602553e35fbf
2 2099200 4196351 2097152 1G bluestore_block_db_1 5023371f-29e6-4d28-ae4d-f84107c1d368
3 4196352 6293503 2097152 1G bluestore_block_wal_1 cc6995ae-77fa-4a05-88a3-88389bb31a07
4 6293504 41943006 35649503 17G bluestore_block_1 ecd23004-d31f-4603-a8dd-b931902c125d
# ls -l /dev/disk/by-partlabel/ | grep _1
lrwxrwxrwx. 1 root root 10 Oct 11 08:27 bluestore_block_1 -> ../../sdb4
lrwxrwxrwx. 1 root root 10 Oct 11 08:27 bluestore_block_db_1 -> ../../sdb2
lrwxrwxrwx. 1 root root 10 Oct 11 08:27 bluestore_block_wal_1 -> ../../sdb3
lrwxrwxrwx. 1 root root 10 Oct 11 08:27 osd_data_1 -> ../../sdb1
# mkfs.xfs /dev/sdb1
# mount /dev/sdb1 /data/ceph/osd/ceph-1
## 注意初始化osd目录前一定要加入此文件,表示初始时使用bluestore
# echo "bluestore" > /data/ceph/osd/ceph-1/type
后面的操作和上面osd设置一样
挂载方式有两种:
1) 配置文件指定:
[osd]
bluestore = true
osd data = /data/ceph/osd/$clust-$id
bluestore block path = /dev/disk/by-partlabel/bluestore_block_$id
bluestore block db path = /dev/disk/by-partlabel/bluestore_block_db_$id
bluestore block wal path = /dev/disk/by-partlabel/bluestore_block_wal_$id
2) osd data 目录下指定软连接
# cd /data/ceph/osd/ceph-1
# ln -sf /dev/disk/by-partlabel/bluestore_block_1 block
# ln -sf /dev/disk/by-partlabel/bluestore_block_db_1 block.db
# ln -sf /dev/disk/by-partlabel/bluestore_block_wal_1 block.wal
[osd]
bluestore = true
osd data = /data/ceph/osd/$clust-$id
MDS手动安装
1 |
|
1 |
|
1 |
|
若有使用cephfs,则MDS节点是必要的。
首先从mon节点拷贝/etc/ceph/{cluster-name}.conf 配置文件。
# 实例模板,其中$cluster 为集群名(这里是ceph),$name 为<节点名>.<mds编号>,比如mds.vm01为$name 则 $id 为vm01
[mds]
mds data = /data/ceph/mds/$cluster-$name
keyring = /data/ceph/mds/$cluster-$name/keyring
[mds.vm01]
host = vm01
[mds.vm02]
host = vm02
[mds.vm03]
host = vm03
创建目录
mkdir -p /data/ceph/mds/ceph-mds.vm01/
创建keyring:ceph auth get-or-create mds.{mds-number} mds 'allow ' osd 'allow *' mon 'allow rwx' > /data/ceph/mds/{cluster}-{mds-number}/keyring。
ceph auth get-or-create mds.vm01 osd 'allow rwx' mds 'allow' mon 'allow profile mds' -o /data/ceph/mds/ceph-mds.vm01/keyring
更改权限
chown -R ceph.admin:ceph.admin /data/ceph/mds
开启MDS
systemctl start ceph-mds@vm01
查看状态
ceph mds stat
# 列出集群池
ceph osd lspools
需要注意的是,此时通过ceph -s是看不到mds相关信息的,ceph mds stat可以看到MDS不是active的状态。需要先创建一个fs,MDS就会被激活。
使用以下命令创建两个pool,一个用来存储fs的文件数据,一个用来存放fs的元数据:ceph osd pool create {pool-name} {pg-number}。
创建fs:ceph fs new {fs-name} {metadata-pool_name} {data-pool_name}。
此时再看ceph mds stat和ceph -s,就能看到mds为active and up的状态了。
# 先创建一个metadata pool,存放元数据,必须多副本,否则元数据丢了,就无法恢复数据
ceph osd pool create metadata 64 64
# 再创建一个data pool,存放实际数据,最好使用低延时的ssd盘
ceph osd pool create data 64 64
格式:
ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] [crush-rule-name] [expected-num-objects]
ceph osd pool create {pool-name} {pg-num} {pgp-num} erasure [erasure-code-profile] [crush-rule-name] [expected_num_objects]
# 需要ceph命令创建文件系统testfs,后两参数是metadata和 data的pool
ceph fs new testfs metadata data
# 获取pool 副本数
# ceph osd pool get metadata min_size
# ceph osd pool get metadata size
# 获取PG 在osd上的分布
# ceph pg dump | grep ^1 | awk '{print $1,$2,$15}'
1.7c 496 [1,3]
1.7d 517 [3,2]
1.7e 496 [2,1]
1.7f 466 [1,2]
mgr 手动安装
1 |
|
1 |
|
1) 配置文件添加:
[mgr]
mgr data = /data/ceph/mgr/$cluster-$name
mgr initial modules = dashboard
2) 创建mgr用户,这里权限可能需要修改一下
# ceph auth get-or-create mgr.vm01 mon 'allow profile mgr' osd 'allow *' mds 'allow *' -o /data/ceph/mgr/ceph-mgr.vm01/keyring
如果已创建好了的密匙,则可以直接导入密匙
# ceph-authtool --create-keyring /data/ceph/mgr/ceph-mgr.vm01/keyring --gen-key -n mgr.vm01 --cap mon 'allow profile mgr' --cap osd 'allow *' --cap mds 'allow *'
# ceph auth import -i /data/ceph/mgr/ceph-mgr.vm01/keyring
# 已有的用户修改权限
# ceph auth caps mgr.vm01 mon 'allow profile mgr' osd 'allow *' mds 'allow *'
# 删除用户
# ceph auth del mgr.vm01
3) 导出用户密钥
# mkdir /data/ceph/mgr/ceph-mgr.vm01
# ceph auth get mgr.vm01 -o /data/ceph/mgr/ceph-mgr.vm01/keyring
# chown -R ceph.admin:ceph.admin /data/ceph/mgr
4) 服务器地址和可选端口必须配置为 config-key
## 服务器地址新版不需要设置,会自动选定一台mgr地址,多余的当备用机,port 默认端口7000,需要可以修改
# ceph config-key put mgr/dashboard/server_addr 200.200.200.221
# ceph config-key put mgr/dashboard/server_port 8888
## 启用mgr dashboard模块,先要启动mgr服务,再启用dashboard
# systemctl start ceph-mgr@vm01
# ceph mgr module enable dashboard
5) 重启ceph-mgr
# systemctl restart ceph-mgr@vm01
需要修改默认启动用户
# vi /usr/lib/systemd/system/ceph-mgr@.service
......
ExecStart=/usr/bin/ceph-mgr -f --cluster ${CLUSTER} --id %i --setuser ceph.admin --setgroup ceph.admin
......
6) 查看模块
# ceph mgr module ls
{
"enabled_modules": [
"balancer",
"dashboard",
"restful",
"status"
],
"disabled_modules": [
"influx",
"localpool",
"prometheus",
"selftest",
"zabbix"
]
}
7) 查看访问地址
# ceph mgr services
{
"dashboard": "http://vm01:7000/"
}
8) 帮助
# ceph mgr help
# ceph tell mgr help
客户端挂载cephfs
# 客户端安装ceph-common
yum install ceph-common
# 使用其他用户挂载
添加一个用户, osd 后面不能加 pool=testfs,否则没写入权限
如果后面用户权限更改了,需要重新加载
# ceph auth add client.john mon 'allow r' osd 'allow rwx' mds 'allow'
在服务器上,列出授权用户
# ceph auth list
client.john
key: AQBie8NZNjGQOBAAagXYD3fSrTwX+sTc+aVjYQ==
caps: [mds] allow
caps: [mon] allow r
caps: [osd] allow rwx
把密钥存入文档
# vi /etc/ceph/john.key
AQBie8NZNjGQOBAAagXYD3fSrTwX+sTc+aVjYQ==
chmod 0600 /etc/ceph/john.key
mkdir -p /mnt/cephfs
# 强制卸载挂载
# umount -fl /mnt/cephfs
# fstab 加载格式:
{ipaddress}:{port}:/ {mount}/{mountpoint} {filesystem-name} [name=username,secret=secretkey|secretfile=/path/to/secretfile],[{mount.options}]
10.100.100.4:6789,10.100.100.5:6789,10.100.100.6:6789:/ /mnt/cephfs ceph name=john,secretfile=/etc/ceph/john.key,noatime,_netdev 0 0
# 语法:mount -t ceph mds_node1:6789,mds_node2:6789,mds_node3:6789:/ client_mount_path -o name=admin,secret=Key_value
删除osd
1 |
|
多MDS变成单MDS的方法
设置最大mds
多活的mds的max_mds会超过1,这里需要先将max_mds设置为1
ceph mds set max_mds 1
deactive mds
ceph mds deactivate 1
重设ceph fs, 先要停止左右的ceph-mds实例
ceph mds fail vm01
systemctl stop ceph-mds@vm01
ceph fs reset datafs –yes-i-really-mean-it
ceph fs status datafs
设置mds期望待机备用数量
ceph fs set datafs standby_count_wanted 1
故障切换的管理¶
如果一个 MDS 守护进程不再与监视器通讯,监视器把它标记为 laggy (滞后)状态前会等待 mds_beacon_grace 秒(默认是 15 秒)。
为安全起见,每个文件系统都要指定一些灾备守护进程,灾备数量包括处于灾备重放状态、等着接替失效 rank 的(记着,灾备重放守护进程不会被重分配去接管另一个 rank 、或者另一个 CephFS 文件系统内的失效守护进程)。不在重放状态的灾备守护进程会被任意文件系统当作自己的灾备。每个文件系统都可以单独配置期望的灾备守护进程数量,用这个:
ceph fs set
count 设置为 0 表示禁用健康检查。
术语¶
一个 Ceph 集群内可以没有、或者有多个 CephFS 文件系统。 CephFS 文件系统有一个人类可读的名字(用 fs new 设置)、和一个整数 ID ,这个 ID 称为文件系统集群 ID 或 FSCID 。
每个 CephFS 都有几个 rank ,默认是一个,从 0 起。一个 rank 可看作是一个元数据分片。文件系统 rank 数量的控制在 多活 MDS 守护进程的配置 里详述。
CephFS 的每个 ceph-mds 进程(一个守护进程)刚启动时都没有 rank ,它由监视器集群分配。一个守护进程一次只能占据一个 rank ,只有在 ceph-mds 守护进程停止的时候才会释放 rank 。
如果某个 rank 没有依附一个守护进程,那这个 rank 就失效了( failed )。分配给守护进程的 rank 才被当作正常的( up )。
首次配置守护进程时,管理员需分配静态的名字,一般配置都会用守护进程所在的主机名作为其守护进程名字。
守护进程每次启动时,还会被分配一个 GID ,对于这个守护进程的特定进程的生命周期来说它是唯一的。 GID 是整数。
Todo
译者注: rank 翻译为“席位”、“座席”?它们共同处理元数据,且动态分配,类似客服中心的座席。
MDS 守护进程的引用¶
针对 MDS 守护进程的大多数管理命令都接受一个灵活的参数格式,它可以包含 rank 、 GID 或名字。
使用 rank 时,它前面可以加文件系统的名字或 ID ,也可以不加。如果某个守护进程是灾备的(即当前还没给它分配 rank ),那就只能通过 GID 或名字引用。
例如,假设我们有一个 MDS 守护进程,名为 myhost ,其 GID 为 5446 ,分配的 rank 是 0 ,它位于名为 myfs 的文件系统内,文件系统的 FSCID 是 3 ,那么,下面的几种形式都适用于 fail 命令:
ceph mds fail 5446 # GID
ceph mds fail myhost # Daemon name
ceph mds fail 0 # Unqualified rank
ceph mds fail 3:0 # FSCID and rank
ceph mds fail myfs:0 # Filesystem name and rank
故障切换的管理¶
如果一个 MDS 守护进程不再与监视器通讯,监视器把它标记为 laggy (滞后)状态前会等待 mds_beacon_grace 秒(默认是 15 秒)。
为安全起见,每个文件系统都要指定一些灾备守护进程,灾备数量包括处于灾备重放状态、等着接替失效 rank 的(记着,灾备重放守护进程不会被重分配去接管另一个 rank 、或者另一个 CephFS 文件系统内的失效守护进程)。不在重放状态的灾备守护进程会被任意文件系统当作自己的灾备。每个文件系统都可以单独配置期望的灾备守护进程数量,用这个:
ceph fs set
count 设置为 0 表示禁用健康检查。
灾备守护进程的配置¶
共有四个选项,用于控制守护进程处于灾备状态时如何工作:
mds_standby_for_name
mds_standby_for_rank
mds_standby_for_fscid
mds_standby_replay
这些配置可写入 MDS 守护进程所在主机(而非监视器上)的 ceph.conf 配置文件。守护进程会在启动时加载这些配置,并发送给监视器。
默认情况下,如果这些选项一个也没配置,那么没领到 rank 的所有 MDS 守护进程都会作为任意 rank 的灾备。
这些配置虽说可以把灾备守护进程关联到特定的名字或 rank ,然而并不能保证这个守护进程只用于那个 rank 。也就是说,有好几个灾备可用时,会用关联的守护进程。假如一个 rank 失效了,而且有一个可用的灾备,那么即使此灾备已关联了另外的 rank 或守护进程名,它仍然会被用掉。
mds_standby_replay¶
如果此选项设置为 true ,灾备守护进程就会持续读取某个处于 up 状态的 rank 的元数据日志。这样它就有元数据的热缓存,在负责这个 rank 的守护进程失效时,可加速故障切换。
一个正常运行的 rank 只能有一个灾备重放守护进程( standby replay daemon ),如果两个守护进程都设置成了灾备重放状态,那么其中任意一个会取胜,另一个会变为普通的、非重放灾备状态。
一旦某个守护进程进入灾备重放状态,它就只能为它那个 rank 提供灾备。如果有另外一个 rank 失效了,即使没有灾备可用,这个灾备重放守护进程也不会去顶替那个失效的。
历史问题:在 v10.2.1 版之前的 Ceph 中,只要设置了 mds_standby_for_* ,这个选项(设置为 false 时)就始终为 true 。
mds_standby_for_name¶
设置此选项可使灾备守护进程只接替与此名字相同的 rank 。
mds_standby_for_rank¶
设置此选项可使灾备守护进程只接替指定的 rank ,如果有其它 rank 失效了,此守护进程不会去顶替它。
你有多个文件系统时,可联合使用 mds_standby_for_fscid 选项来指定想为哪个文件系统的 rank 提供灾备。
mds_standby_for_fscid¶
如果设置了 mds_standby_for_rank ,那么这里可把它限定为是哪个文件系统的 rank 。
如果没设置 mds_standby_for_rank ,那么设置 FSCID 后,这个守护进程可用于此 FSCID 所相关的任意 rank 。当你想让某一守护进程可作任意 rank 的灾备、但仅限于某个特定文件系统时,可用此选项实现。
mon_force_standby_active¶
这些选项用于监视器主机,默认值为 true 。
如果设置为 false ,那么配置为 standby_replay=true 的灾备守护进程只会顶替它们负责的 rank 或指定名字。反之,如果这里设置为 true ,那么配置为 standby_replay=true 的灾备守护进程有可能被分配其它 rank 。
实例¶
这些是 ceph.conf 配置实例。实践中,你可以让所有服务器上的所有守护进程都使用相同的配置文件,也可以让各服务器上的配置文件各不相同,其中只包含它的其守护进程相关的配置。
简单的一对¶
两个 MDS 守护进程 a 和 b 作为一对,其中任意一个没分到 rank 的将作为另一个的灾备重放追随者。
[mds.a]
mds standby replay = true
mds standby for rank = 0
[mds.b]
mds standby replay = true
mds standby for rank = 0
浮动灾备¶
某一文件系统有三个 MDS 守护进程: a 、 b 、 c ,其 max_mds 为 2 。
无须过多配置,没有分到 rank 的守护进程会成为灾备,它会顶
替任何一个失效的守护进程。
两个 MDS 集群¶
有两个文件系统、四个 MDS 守护进程,我想让其中两个作为一对服务于一个文件系统,另外两个作为一对服务于另一个文件系统。
[mds.a]
mds standby for fscid = 1
[mds.b]
mds standby for fscid = 1
[mds.c]
mds standby for fscid = 2
[mds.d]
mds standby for fscid = 2
客户端配置参考¶
client acl type
描述: 设置 ACL 类型。现在还只能设置为 “posix_acl” 表示启用 POSIX ACL ,或者可设置为空字符串。此选项只有在 fuse_default_permissions 被设置为 false 时有效。
类型: String
默认值: “” (no ACL enforcement)
client cache mid
描述: 设置客户端缓存中点。此中点把最近用过的列表分割为热列表和暖列表。
类型: Float
默认值: 0.75
client_cache_size
描述: 设置客户端可保留在元数据缓存中的索引节点数量。
类型: Integer
默认值: 16384
client_caps_release_delay
描述: 设置释放能力的延时,单位为秒。这个延时控制着客户端不再需要能力时,再等多少秒就释放,以便其它需要这些能力的用户使用。
类型: Integer
默认值: 5 (seconds)
client_debug_force_sync_read
描述: 设置为 true 时,客户端会跳过本地页缓存、直接从 OSD 读取数据。
类型: Boolean
默认值: false
client_dirsize_rbytes
描述: 设置为 true 时,就采用目录的递归尺寸(也就是其内所有文件尺寸之和)。
类型: Boolean
默认值: true
client_max_inline_size
描述: 控制内联数据的最大尺寸,小于此尺寸就存储到文件的索引节点内,超过则存到单独的 RADOS 对象内。本选项只有设置了 MDS 图的 inline_data 标志时有效。
类型: Integer
默认值: 4096
client_metadata
描述: 客户端向各 MDS 发送元数据时,除了自动生成的版本号、主机名等信息,还可以附加逗号分隔的字符串作为附加元数据。
类型: String
默认值: “” (没有附加元数据)
client_mount_gid
描述: 设置 CephFS 挂载后的组 ID 。
类型: Integer
默认值: -1
client_mount_timeout
描述: 设置挂载 CephFS 时的超时时间,单位为秒。
类型: Float
默认值: 300.0
client_mount_uid
描述: 设置 CephFS 挂载后的用户 ID 。
类型: Integer
默认值: -1
client_mountpoint
描述: 指定要挂载的 CephFS 文件系统目录。此选项的作用类似 ceph-fuse 命令的 -r 选项。
类型: String
默认值: “/“
client_oc
描述: Enable object caching.
类型: Boolean
默认值: true
client_oc_max_dirty
描述: 设置对象缓存的脏数据上限,单位为字节。
类型: Integer
默认值: 104857600 (100MB)
client_oc_max_dirty_age
描述: 设置脏数据在对象缓存中的最大存留时间,单位为秒。
类型: Float
默认值: 5.0 (秒)
client_oc_max_objects
描述: 设置对象缓存允许的最大对象数。
类型: Integer
默认值: 1000
client_oc_size
描述: 设置客户端可缓存的数据上限,单位为字节。
类型: Integer
默认值: 209715200 (200 MB)
client_oc_target_dirty
描述: 设置认定为脏数据的目标尺寸。我们建议这个数字尽量小些。
类型: Integer
默认值: 8388608 (8MB)
client_permissions
描述: 检查所有 I/O 操作的客户端权限。
类型: Boolean
默认值: true
client_quota
描述: 设置为 true 表示启用客户端配额。
类型: Boolean
默认值: true
client_quota_df
描述: 让 statfs 操作报告根目录的配额。
类型: Boolean
默认值: true
client_readahead_max_bytes
描述: 设置内核预读数据的最大尺寸,单位为字节。本选项可被 client_readahead_max_periods 覆盖。
类型: Integer
默认值: 0 (unlimited)
client_readahead_max_periods
描述: 设置内核预读的文件布局分片最大数量(对象尺寸 * 条带数量)。本选项会覆盖 client_readahead_max_bytes 选项。
类型: Integer
默认值: 4
client_readahead_min
描述: 设置内核预读的最小尺寸,单位为字节。
类型: Integer
默认值: 131072 (128KB)
client_reconnect_stale
描述: 是否自动重连过期的会话。
类型: Boolean
默认值: false
client_snapdir
描述: 设置快照目录名。
类型: String
默认值: “.snap”
client_tick_interval
描述: 设置更新能力及维持其它信息的间隔时长,单位为秒。
类型: Float
默认值: 1.0 (秒)
client_use_random_mds
描述: 为各个请求随机选取 MDS 。
类型: Boolean
默认值: false
fuse_default_permissions
描述: 设置为 false 时, ceph-fuse 工具会用自己的权限验证机制,而非依靠 FUSE 的强制权限。启用 POSIX ACL 需把此选项设置为 false 、同时设置 client acl type=posix_acl 。
类型: Boolean
默认值: true
开发者选项¶
Important
以下选项仅供内部测试,只是为了保持文档完整才罗列在这里。
client_debug_getattr_caps
描述: 检查 MDS 的响应是否有必要的能力。
类型: Boolean
默认值: false
client_debug_inject_tick_delay
描述: 在客户端动作之间人为地加入延时。
类型: Integer
默认值: 0
client_inject_fixed_oldest_tid
描述:
类型: Boolean
默认值: false
client_inject_release_failure
描述:
类型: Boolean
默认值: false
client_trace
描述: 所有文件操作的追踪文件的路径。其输出可用于 Ceph 的人造客户端。
类型: String
默认值: “” (disabled)
https://drunkard.github.io/cephfs/client-config-ref/
参考:
http://caitianxiong.com/2017/02/25/deploy-ceph-cluster-manually/#more
https://lotuslab.org/2017/03/11/Ceph_manual_deploy_guide.html
http://docs.ceph.org.cn/install/manual-deployment/
http://www.cnblogs.com/boshen-hzb/p/6927407.html
手动添加ceph的mds
1、在需要安装的目标机器上创建mds目录
mkdir -p /data/ceph/mds/ceph-0
2、生成mds的keyring,并将其写入/data/ceph/mds/ceph-0/keyring文件中
ceph auth get-or-create mds.0 mon ‘allow rwx’ osd ‘allow *’ mds ‘allow’ -o /data/ceph/mds/ceph-0/keyring
上面红色部分不能写成allow *,要不然会报错。
3、
apt-get install ceph-mds
ceph-mds –cluster ceph -i 0 -m 10.111.131.125:6789
4、创建文件系统
ceph osd pool create cephfs_data 100
ceph osd pool create cephfs_metadata 100
ceph fs new cephfs cephfs_metadata cephfs_data
How-to quickly deploy a MDS server.
Assuming that /data/ceph/mds/mds is the mds data point.
Edit ceph.conf and add a MDS section like so:
[mds]
mds data = /data/ceph/mds/mds.$id
keyring = /data/ceph/mds/mds.$id/mds.$id.keyring
[mds.0]
host = {hostname}
Create the authentication key (only if you use cephX):
$ sudo mkdir /data/ceph/mds/mds.0
$ sudo ceph auth get-or-create mds.0 mds ‘allow ‘ osd ‘allow *’ mon ‘allow rwx’ > /data/ceph/mds/mds.0/mds.0.keyring
https://my.oschina.net/itfanr/blog/397044
修改/etc/ceph/ceph.conf文件:
[global]
auth supported = none
osd pool default size = 2
osd crush chooseleaf type = 0
objecter_inflight_op_bytes=4294967296
objecter_inflight_ops=1024
#debug filestore = 100
#debug osd = 10
debug journal = 1
filestore blackhole=false
filestore queue max ops=1024
filestore queue max bytes=1073741824
filestore max sync interval=5
#osd op num threads per shard=1
#osd op num shards=1
filestore wbthrottle enable=false
filestore merge threshold=50
filestore split multiple=10
#osd objectstore=satafilestore
[mon]
[mon.0]
host = itfanr-host1
mon addr = 192.168.100.14:6789
[mds]
[mds.0]
host = itfanr-host1
[osd]
osd mkfs type = xfs
osd mkfs options xfs = -f -i size=2048
osd mount options xfs = inode64,noatime
osd crush update on start = 0
[osd.0]
host = itfanr-host1
devs = /dev/sdb1
osd journal = /dev/sdb2
[osd.1]
host = itfanr-host1
devs = /dev/sdc1
osd journal = /dev/sdc2
[osd.2]
host = itfanr-host1
devs = /dev/sdd1
osd journal = /dev/sdd2
[osd.3]
host = itfanr-host1
devs = /dev/sde1
osd journal = /dev/sde2